Strava,Garminのデータを活用してGPSデータをTableauで可視化する
火薬田ドンの花火オチを見て、本格的な夏の到来を感じる今日この頃です。しんやです。
さて、本題。
サイクリング・ウォーキングのデータを記録するアプリは最近様々なものが出ています。それらのデータはアプリ内で可視化されていて結果を閲覧する事が出来ますが、任意のデータ形式でエクスポートが可能なものもあり、そのデータを別のアプリで活用する事も出来たりします。当エントリではそんなデータをTableauで可視化してみましたという内容でお届けしたいと思います。
目次
GPXデータの可視化 - Strava&Tableau連携
まず始めにGPXと呼ばれるフォーマットのデータをTableauで可視化する流れから。GPXフォーマットはGPSセンサー・ロガーとGPSソフトウェア間で相互にGPSデータを交換するために考案されたXML文書の一形式で。書式はXML Schemaで定義されています。細かい情報については以下リンクなどをご参照ください。
スマホ側にアプリをインストールします。Android/iPhone共に対応アプリが用意されていますので対応したものをインストールしておいてください。
- Strava GPS ランニング&サイクリング - Google Play の Android アプリ
- iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 Strava GPS ランニング&サイクリング
アプリの設定を行い、記録開始。記録を終えたら『アクティビティ』としてデータを保存しておきます。
今回検証用に記録した内容は以下の通り。横浜みなとみらい、クイーンズタワーから赤レンガ倉庫〜山下公園前を経由し、戻ってくる形で中華街前を横切り馬車道〜桜木町駅前を通過、分かり易い標高データを取るために三ツ沢公園球技場付近まで登ってみています。(※ちなみに普段ランニングしたり2つ車輪が付いた乗り物で走る習慣が無く、今回は4つ車輪が付いた乗り物でデータ取得を行いました。データ的にはアレなのでデータ取得後アクティビティは削除しました)
設定からGPXデータのエクスポートが出来るので選択。データをGPXファイル形式でダウンロードします。
中身を確認してみます。形式的にはXMLの形になっていました。緯度経度(lat,lon)と標高(ele)、また記録した時間(time)が<trkpt>というレコードの中に格納されているようです。
<?xml version="1.0" encoding="UTF-8"?> <gpx creator="strava.com Android" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> <metadata> <time>2015-07-25T11:15:14Z</time> </metadata> <trk> <name>イブニングライド</name> <trkseg> <trkpt lat="35.4546170" lon="139.6323740"> <ele>3.1</ele> <time>2015-07-25T11:15:14Z</time> </trkpt> <trkpt lat="35.4545920" lon="139.6323950"> <ele>2.8</ele> <time>2015-07-25T11:15:15Z</time> </trkpt> <trkpt lat="35.4546330" lon="139.6324350"> <ele>2.8</ele> <time>2015-07-25T11:15:24Z</time> </trkpt> :
このままの形式ではTableauに読み込ませる事が出来ないので、CSV形式に変換を行います。Pythonを使って以下の様な形でCSVを生成するプログラムを突貫で作ってみました。
- 20.5. xml.etree.ElementTree — ElementTree XML API — Python 3.4.3 ドキュメント
- Python: テキストファイルに書き込み – write()、writelines()メソッド
import xml.etree.ElementTree as ET tree = ET.parse('evening-ride.gpx') root = tree.getroot() tracklist = root[1][1] user = "shinyaa31" id = 1 file = open('ride-record.csv','w') header = "user,id,time,lat,lon,ele\n" file.writelines(header) for track in tracklist: lat = track.get("lat") lon = track.get("lon") ele = track[0].text time = track[1].text record = user + "," + str(id) + "," + time.replace("T"," ").replace("Z","") + "," + lat + "," + lon + "," + ele file.writelines(record + '\n') id+=1 file.close()
生成結果は以下の様になりました。
user,id,time,lat,lon,ele shinyaa31,1,2015-07-25 11:15:14,35.4546170,139.6323740,3.1 shinyaa31,2,2015-07-25 11:15:15,35.4545920,139.6323950,2.8 shinyaa31,3,2015-07-25 11:15:24,35.4546330,139.6324350,2.8 shinyaa31,4,2015-07-25 11:15:26,35.4546840,139.6324890,2.7 shinyaa31,5,2015-07-25 11:15:27,35.4547270,139.6325250,2.7 shinyaa31,6,2015-07-25 11:15:28,35.4547760,139.6325680,2.7 shinyaa31,7,2015-07-25 11:15:29,35.4548230,139.6326080,2.7 shinyaa31,8,2015-07-25 11:15:30,35.4548720,139.6326510,2.6 shinyaa31,9,2015-07-25 11:15:31,35.4549260,139.6326860,2.7 shinyaa31,10,2015-07-25 11:15:32,35.4549780,139.6327230,2.8 :
CSVファイルをTableauで読み込み、緯度経度で配置→時間(秒単位までの正確な情報)で詳細表示を行い、履歴表示等をさせた地図ビューと、時間(秒単位までの正確な情報)を横軸、標高を縦軸とした棒グラフを連携させたダッシュボードが以下となります。時間の『ページ』機能で移動内容の遷移が再生表示可能となっています(注:Desktop版のみ)が、件数が多過ぎる(1000件以上)のと時間の区切りが秒単位な為、一番早い再生速度でもかなり牛歩なアニメーションになってしまいました。この辺り、可視化で活用するのであれば『10秒』毎の表示とするためにデータを間引くとか、何らか対処が必要なのかなと思った次第です。若しくは再生速度をN倍速に出来るとかが今後実現すると嬉しいのかなとも思います。(この辺は個人的な要望ですが)
TCXデータの可視化 - Garmin&Tableau連携
GPSデータでもう1つご紹介。こちらは『TCX』と呼ばれるフォーマットで、Garminと呼ばれるアプリ独自のフォーマットの様です。
- Home | Garmin Developers
- Additional Resources | Developer Resources | Garmin Developers
- TCXとPWXのファイルフォーマット - 一汁三菜
- GPSデータ(GPX, TCX等)の効率的な編集 - CBN Bike Forums
- Garmin Training Centerデータ解析ツール自作
- 無理はしない|フルマラソンが好きです、でもウルトラマラソンのほうがもっと好きです。
Garminに関する情報はこちら。
Garminで取得したデータについては、ロードレーサーとして実業団レースにも参加しているsuzuki.ryoさんがこのアプリを使ってデータを取得しているとの事なので、データを頂きました。ありがとうございます!
Garminのデータについては、別のツール(GoldenCheetahというツールらしいです)でエクスポートする事でJSON/CSV/TCXのそれぞれのフォーマットファイルが生成される模様。今回はCSVとTCX(こちらもGPX同様、XML形式)を用いて、上記同様Tableauを使って可視化してみました。CSVの方には時速とワット数が情報として付与されていたので、併せて活用してみています。
記録としては、右下の方から始まり、左上の方で終わる形。途中時速的にも早い(スピードに乗っている)箇所もあるな〜という事が分かる一方で、標高の遷移を見ると...終始上り坂?標高差1000メートルって!中盤以降は時速も遅い部分と持ち直している部分がある事が読み取れます。というかsuzuki.ryoさん、凄すぎです...w
なお、GPX/TCX共に時間が若干ズレている(記録時のタイムゾーンがJSTでは無い模様)のを確認しましたが、今回はそこまで時間情報が重要では無かったのでそのままの時間情報で可視化まで進めました。必要であればPythonでのパースの時点で時間を調整する or データベースに取り込むのであればSQL関数で変換を掛ける、等行う必要があるかと思います。
まとめ
以上、GPSデータに関する可視化のまとめでした。スポーツ系(サイクリングやウォーキング)やGPSを使ったイベント系のデータ等もエクスポートして変換を噛ませばTableauで割と平易に可視化が出来る事が分かりました。紹介した情報の他にも、アプリ側で色々な付加情報を記録・送信させる事が出来れば活用の幅やアイデアも色々広がりそうですね。こちらからは以上です。